/*
 * @(#)XfspIsoscelesMFMerger.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.model.types;

import xfuzzy.lang.Parameter;
import xfuzzy.lang.ParamMemFunc;
import xfuzzy.lang.Universe;
import xfuzzy.lang.XflException;

/**
 * <p> <b>Descripci�n:</b> clase de objetos que fusionan dos funciones de
 * pertenencia de tipo Isosceles.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 1.2
 * @see IXfspMFMerger
 *
 */
public class XfspIsoscelesMFMerger
    implements IXfspMFMerger {

  /**
   * <p> <b>Descripci�n:</b> crea un objeto que fusiona funciones de
   * pertenencia tipo Isosceles.
   *
   */
  public XfspIsoscelesMFMerger() {
  }

  /**
   * <p> <b>Descripci�n:</b> une dos funciones de pertenencia de tipo Isosceles
   * de un sistema difuso obteniendo una nueva funci�n de pertenencia que sea
   * similar a ambas.
   * @param mf1 Una funci�n de pertenencia de un tipo de un sistema difuso.
   * @param mf2 Otra funci�n de pertenencia de un tipo de un sistema difuso
   * (puede ser igual que la primera).
   * @param universe Universo de discurso com�n a las dos funciones de
   * pertenencia.
   * @return Nueva funci�n de pertenencia correspondiente a la uni�n de las dos
   * funciones de pertenencia que se le pasan como par�metro.
   *
   */
  public ParamMemFunc merge(ParamMemFunc mf1, ParamMemFunc mf2,
                            Universe universe) {
    double[] param1 = mf1.get();
    double[] mergedparam = new double[param1.length];
    double a1=0.0, a2=0.0, a3, b1=0.0, b2=0.0, b3;
    ParamMemFunc mergedmf = (ParamMemFunc) mf1.clone(universe);
    Parameter[] pm1 = mf1.getParameters();
    Parameter[] pm2 = mf2.getParameters();

    try {
      for (int i = 0; i < pm1.length; i++) {
        if (pm1[i].getName().equals("a")) {
          //param = (mf1.parameter[i].value + mf2.parameter[i].value) / 2;
          //dist = Math.abs(mf1.parameter[i].value - mf2.parameter[i].value);
          a1 = pm1[i].value;
          a2 = pm2[i].value;
        }
        else if (pm1[i].getName().equals("b")) {
          //param = Math.max(mf1.parameter[i].value+(dist/2), mf2.parameter[i].value+(dist/2));
          b1 = pm1[i].value;
          b2 = pm2[i].value;
        }
        //mergedparam[i] = param;
      }
      a3 = (Math.min(a1-b1, a2-b2)+Math.max(a1+b1, a2+b2))/2;
      b3 = (Math.max(a1+b1, a2+b2)-Math.min(a1-b1, a2-b2))/2;
      mergedparam[0]=a3;
      mergedparam[1]=b3;
      mergedmf.set(mergedparam);
    }
    catch (XflException e) {
    }
    return mergedmf;
  }
}
